package com.abel.redis;

/**
 * @author heaveneleven
 * @date 2019/1/29
 */
public interface Lock {
    /**
     * 获取锁 指定了要锁的键、该锁的持有者（用于释放时认证）以及超时时间
     * @param key
     * @param owner
     * @param timeout
     * @return
     */
    boolean lock(String key, String owner, long timeout);

    /**
     * 获取锁 采用默认的超时时间, 在对处理实效性没有高要求时可使用
     * @param key
     * @param owner
     * @return
     */
    boolean lock(String key, String owner);

    /**
     * 获取锁 最简单的方式 对单个键进行加锁, 任何客户端都能释放锁
     * @param key
     * @return
     */
    boolean lock(String key);

    /**
     * 自旋获取锁
     * 加锁主要过程
     * @param key     加锁对象
     * @param owner   锁的持有者
     * @param timeout 自旋时间
     * @return
     */
    boolean trylock(String key, String owner, long timeout);

    /**
     * 释放锁 指定锁的拥有者 对应 lock(String key, String owner, long timeout)
     *                      & lock(String key, String owner)
     * @param key
     * @param owner
     * @return
     */
    boolean unlock(String key, String owner);

    /**
     * 释放锁 对应 lock(String key)
     * @param key
     * @return
     */
    boolean unlock(String key);

}
